-- Copyright (c) 2016 Lucky Byte, Inc.
--
-- Summary : 从文件导入数据到数据表
--
-- Author : xiaohu <xiaohu@lucky-byte.com>
-- Since  : 2016.2.03
--
-- History
--  2016.02.03 : 建立此文件
--  2016.07.29 : 文件拆分
--  2016.08.03 : 处理数据库事务中的异常
--

-- 逐行导入数据
local _load_file = function(args)
    local _line_num = 1
    local _fail_num = 0

    for _line in io.lines(args.filepath) do
        if string.trimlen(_line) > 0 then
            local _record = args.line_split(
                args.filepath, _line_num, _line, args.extra)
            if _record then
                -- logger.trace('记录: ' .. table.format(_record))
                if jdbc.upsert(args.table_name, _record, args.unique_keys) < 0 then
                    logger.error('导入记录[%s]到[%s]失败.', table.format(_record),
                        args.table_name)
                    return false
                end
            else
                logger.warn('导入文件第 %d 行失败.', _line_num)
                _fail_num = _fail_num + 1
            end
        else
            logger.warn('文件第 %d 行无数据.', _line_num)
        end
        _line_num = _line_num + 1
    end

    if _fail_num > 0 then
        notify.warn('从文件[%s]中成功导入[%d]条数据，[%d]条数据导入失败.',
            args.filepath, _line_num - 1, _fail_num)
    else
        logger.debug('从文件[%s]中成功导入[%d]条数据到[%s].', args.filepath,
            _line_num - 1, args.table_name)
    end
    return true
end


-- 从文件导入数据表
-- 这个函数会先清空数据表，然后再导入新数据.
--
-- 参数
--   args.filepath    : 文件路径，全路径
--   args.table_name  : 数据表名
--   args.line_split  : 处理单行数据的函数
--   args.unique_keys : 数据记录唯一索引
--
local _load_from_file = function(args)
    if string.trimlen(args.filepath) == 0 then
        logger.error('从文件导入数据失败，未指定文件名参数.')
        return false
    end
    if string.trimlen(args.table_name) == 0 then
        logger.error('从文件导入数据失败，未指定目标数据表名.')
        return false
    end
    if not args.line_split then
        logger.error('导入银联数据失败，未指定处理单行数据的函数.')
        return false
    end

    -- 检查文件是否存在并可读
    local _f = io.open(args.filepath)
    if not _f then
        logger.error('文件[%s]不存在或不可读，加载数据失败.', args.filepath)
        return false
    end
    io.close(_f)

    logger.debug('开始从[%s]导入数据到[%s].', args.filepath, args.table_name)

    local _ret = _load_file(args)
    if not _ret then
        logger.error('从[%s]导入数据到[%s]失败.', args.filepath, args.table_name)
        return false
    end
    return _ret
end


return _load_from_file
